package UILayer;
import java.util.Scanner;
import controlLayer.*;
/**
 * Denne klasse er vores salgs grænsefalde, vi bruger den i main menu til at arbejde med salgs klassen i de andre lag.
 * @author Gruppe 2
 * @version 1.0
 */
public class SalgsKartotekUI
{
    private SalgsKartotekCTR salgCtr;

    /**
     * Vores constructor for salgskartotek, skaber forbindelse mellem salgs UI og salgs controlleren
     */
    public SalgsKartotekUI()
    {
        salgCtr = new SalgsKartotekCTR();
    }

    /**
     * Vores metode til at starte salgs menuen, bliver kaldt af main menu.
     */
    public void start()
    {
        salgMenu();

    }

    /**
     * Metoden som skaber vores salgs menu, vi har indbygget beskyttelse mod brug af andre tal ind de åbenlyse muligheder. Salgs menuen kalder metoder længere nede i klassen,
     * disse metoder er vores adgang til de andre lag.
     */
    public void salgMenu()
    {   
        boolean exit = false;
        while(!exit)
        {
            //show menu and return the user's choise
            int choice =   writeSalgMenu();
            if(choice != 1 && choice != 2 && choice !=3 && choice !=4 && choice != 5 && choice != 6)
            {
                System.out.println("Du skal vælge enten 1, 2, 3, 4, 5 eller 6");
            }
            if (choice == 1)
            {
                findSalg();
            }
            else{if(choice == 2){
                    opretSalg();
                }
                else{
                    if(choice == 3){
                        opdaterSalg();
                    }
                    else{
                        if(choice == 4){
                            sletSalg();
                        }
                        else{
                            if(choice == 5){
                                listAllSalg();
                            }
                            else{
                                if(choice == 6)
                                {
                                    exit = true;
                                }
                            }//end else
                        }//end else
                    }//end else
                }//end else
            }//end else

        }//end while
    }

    /**
     * Metoden som skriver selve salgs metoden, den viser brugeren hvad valgene er og modtager inputte som menuen bruger. Vi har indbygget beskyttelse mod brugen af bogstaver.
     * @return int choice
     */
    private int writeSalgMenu()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println(" *** Salgs Menu ***");
        System.out.println(" (1) Vis Salgs information");
        System.out.println(" (2) Opret Salg");
        System.out.println(" (3) Opdater Salg");
        System.out.println(" (4) Slet Salg");
        System.out.println(" (5) Vis salgs register");        
        System.out.println(" (6) Gå til hovedmenu");
        System.out.print("\n Skriv dit valg her: ");

        int choice = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                choice = keyboard.nextInt();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive et tal - Prøv igen.");
                String input = keyboard.nextLine();
            }

        }//end while
        return choice;
    }

    /**
     * Vores metode for at inputte ordrenr, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long ordreNr
     */
    private long inputOrdreNr()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv salgs ordre nummer: ");
        long ordreNr = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                ordreNr = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive et tal - Prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return ordreNr;
    }
    
    /**
     * Vores metode for at inputte udlejnings id, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long id
     */
    private long inputUdlejningsId()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv salgs ordre nummer: ");
        long id = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                id = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive et tal - Prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return id;
    }

    /**
     * Vores metode for at inputte stregkode, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long stregkode
     */
    private long inputStregkode()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv vare gruppens stregkode: ");
        long stregkode = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                stregkode = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive tal - prøv igen");
                String input = keyboard.nextLine();
            }
        }
        return stregkode;
    }

    /**
     * Vores metode for at inputte et nyt ordrenr, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long ordreNr
     */
    private long inputNyOrdreNr()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv salgs ordre nummer: ");
        long ordreNr = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                ordreNr = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive tal - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return ordreNr;
    }

    /**
     * Vores metode for at inputte rabat, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return int rabat
     */
    private int inputRabat()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv salgs rabat: ");
        int rabat = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                rabat = keyboard.nextInt();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive tal - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return rabat;
    }

    /**
     * Vores metode for at inputte udlejnings id, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long udlejningsId
     */
    private long inputUdlejningsID()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv udlejnings id: ");
        long udlejningsId = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                udlejningsId = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive tal - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return udlejningsId;
    }

    /**
     * Vores metode for at inputte vare id, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @return long vareId
     */
    private long inputVareID()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv vare id: ");
        long vareId = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                vareId = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal skrive tal - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return vareId;
    }

    /**
     * En metode til at inputte cprnr
     * @return String cprNr
     */
    private String inputCprNr()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv kundens cprnr: ");
        String cprNr = keyboard.nextLine();
        return cprNr;
    }

    /**
     * Vores metode til at finde et salg. Bruger vores input metode for ordre nr.
     */
    private void findSalg()
    {
        long ordreNr = inputOrdreNr();
        salgCtr.findSalg(ordreNr);
    }

    /**
     * Vores metode til at oprette et salg, bruger flere af vores input metoder til at få de variabler den skal bruge.
     */
    private void opretSalg()
    {
        long ordreNr = inputOrdreNr();
        String cprNr = inputCprNr();
        int rabat = inputRabat();
        long vareId = inputVareID();
        long stregkode = inputStregkode();
        long udlejningsId = inputUdlejningsId();
        boolean ok = false;
        while(!ok)
        {
            try
            {
                salgCtr.opretSalg(cprNr, stregkode, vareId, ordreNr, rabat, udlejningsId);
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Du skal sørge for at en vare og udlejning eksistere før du opretter et salg");                
            }

        }
        
    }

    /**
     * Vores metode til at skabe opdater menuen, har indbygget beskyttelse mod brugen af forkerte tal.
     */
    private void opdaterSalg()
    {
        boolean exit = false;
        while(!exit)
        {
            //show menu and return the user's choise
            int choice =   writeUpdateMenu();
            if(choice != 1 && choice != 2 && choice !=3 && choice != 4 && choice != 5 && choice != 6 && choice != 7 && choice != 8)
            {
                System.out.println("Du skal vælge enten 1, 2, 3, 4, 5, 6, 7 eller 8");
            }
            if (choice == 1)
            {
                updateOrdreNr();
            }
            else{if(choice == 2){
                    addVare();
                }
                else{
                    if(choice == 3){
                        addUdlejning();
                    }
                    else{
                        if(choice == 4){
                            updateTotal();
                        }
                        else{
                            if(choice == 5){
                                updateRabat();
                            }
                            else{
                                if(choice == 6){
                                    addKunde();
                                }
                                else{
                                    if(choice == 7){
                                        sletKunde();
                                    }
                                    else{
                                        if(choice == 8){
                                            exit = true;
                                        }
                                    }//end else
                                }//end else
                            }//end else
                        }
                    }
                }
            }
        }
    }

    /**
     * Vores metode til opdatere ordre nr. Bruger vores input metode for ordre nr.
     */
    private void updateOrdreNr()
    {
        long ordreNr = inputOrdreNr();
        long nyOrdreNr = inputNyOrdreNr();
        salgCtr.updateOrdreNr(ordreNr, nyOrdreNr);
    }

    /**
     * Vores metode som tilføjer varer. Bruger vores input metode for ordre nr.
     */
    private void addVare()
    {
        long ordreNr = inputOrdreNr();
        long vareId = inputVareID();
        long stregkode = inputStregkode();
        salgCtr.addVare(stregkode, vareId, ordreNr);
    }

    /**
     * Vores metode som tilføjer udlejninger. Bruger vores input metode for ordre nr.
     */
    private void addUdlejning()
    {
        long ordreNr = inputOrdreNr();
        long udlejningsId = inputUdlejningsID();
        salgCtr.addUdlejning(udlejningsId, ordreNr);

    }

    /**
     * Vores metode til opdatere total prisen. Bruger vores input metode for ordre nr.
     */
    private void updateTotal()
    {
        long ordreNr = inputOrdreNr();
        long id = inputUdlejningsId();
        salgCtr.updateTotal(ordreNr, id);
    }

    /**
     * Vores metode til opdatere rabatten. Bruger vores input metode for ordre nr.
     */
    private void updateRabat()
    {
        long ordreNr = inputOrdreNr();
        int rabat = inputRabat();
        salgCtr.updateRabat(ordreNr, rabat);
    }

    /**
     * Vores metode som tilføjer kunder. Bruger vores input metode for ordre nr.
     */
    private void addKunde()
    {
        long ordreNr = inputOrdreNr();
        String cprNr = inputCprNr();
        salgCtr.addKunde(cprNr, ordreNr);
    }

    /**
     * Vores metode som sletter kunder. Bruger vores input metode for ordre nr.
     */
    private void sletKunde()
    {
        long ordreNr = inputOrdreNr();
        String cprNr = inputCprNr();
        salgCtr.sletKunde(cprNr, ordreNr);
    }

    /**
     * Vores metode som skaber selve grænsefalden for opdatere menuen, den modtager også indput til at opdatere menuen, og har derfor indbygget beskyttelse mod brugen af bogstaver.
     * @return int choice
     */
    private int writeUpdateMenu()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println(" *** Opdatere Salg ***");
        System.out.println(" (1) Opdatere ordre nummer");
        System.out.println(" (2) Tilføj vare");
        System.out.println(" (3) Tilføj udlejning");
        System.out.println(" (4) Opdatere total pris");
        System.out.println(" (5) Opdatere rabat");
        System.out.println(" (6) Opdatere kunde");
        System.out.println(" (7) Back");
        System.out.print("\n Make your choice: ");

        int choice = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                choice = keyboard.nextInt();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("You must enter a number -  try again");
                String input = keyboard.nextLine();
            }

        }//end while
        return choice;
    }

    /**
     * Vores metode som sletter salg. Bruger vores input metode for ordre nr.
     */
    private void sletSalg()
    {
        long ordreNr = inputOrdreNr();
        salgCtr.sletSalg(ordreNr);
    }

    /**
     * Vores metode som udskriver alle salg.
     */
    private void listAllSalg()
    {
        System.out.println(salgCtr.printSalgsKartotek()+"\n");
    }
}

    